<?php

/**
 * Abone içeri aktarım işlemlerini gerçekleştirir.
 *
 * @author Ali OYGUR <alioygur@gmail.com>
 */
class Import_lib
{
	/** 
	 * CI supper global object
	 *
	 * @var object
	 */
	private $ci = NULL;
	
	/**
	 * dataların bulunduğu dosyanın tam yolu
	 *
	 * @var string
	 */
	private $file_path = NULL;
	
	/**
	 * User id		
	 *
	 * @var int
	 */
	private $user_id = NULL;

	/**
	 * Group id
	 *
	 * @var int
	 */
	private $group_id = NULL;
	
	/**
	 * mysql temp tablo adı.
	 *
	 * @var string
	 */
	private $tmp_table = NULL;	

	/**
	 * extract edilen satırlar bu değişkende tutulur.
	 *
	 * @var array
	 */
	private $address = array();

	public function __construct($config = array())
	{
		$this->ci = &get_instance();
		
		$this->file_path = $config['file_path'];
		$this->user_id = $config['user_id'];
		$this->group_id = $config['group_id'];
		
		$this->tmp_table = $this->create_temp_table();
	}

	public function extract()
	{
		$ext = self::_file_ext();

		$method = (!$ext == 'csv') ? '_extract_from_txt' : '_extract_from_csv';

		$this->address = self::$method();
		
		return $this;
	}

	/**
	 * Kendisine yolu belirtilen dosyayı satırbaşını referans alarak
	 * Parçalıyıp dizi değişken şeklinde döndürür.
	 *
	 * @return array
	 */
	private function _extract_from_txt()
	{
		$rows = file($this->file_path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

		$data = array();

		$num_rows = count($rows);

		for ($i = 0; $i < $num_rows; $i++)
		{	
			// email alanı boşsa başa sar
			if ($rows[$i] == '')
				continue;
						
			$data[] = array($rows[$i], NULL, NULL, NULL);
		}
		
		return $data;
	}

	/**
	 * csv dosyasında bulunan dataları okuyup dizi değişken olarak döndürür.
	 *
	 * @return void
	 */
	private function _extract_from_csv()
	{
		$filename = $this->file_path;
		$delimiter = ';';

		$data = array();

		if (($handle = fopen($filename, 'r')) !== FALSE)
		{
			while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
			{
				// sadece ilk 4 elemanı çek
				$row = array_slice($row, 0, 4);

				// 4ten az eleman varsa 4e tamamla
				$row = array_pad($row, 4, NULL);

				// email alanı boşsa başa sar
				if ($row[0] == '')
					continue;

				// satırı data değişkenine yaz
				$data[] = $row;

			}
			fclose($handle);
		}

		return $data;
	}

	/**
	 * Kendisine verilen dataları bazı filtrelerden geçirir. 
	 * Ve db ye kayıt edilebilecek duruma getirir.
	 */
	public function filter()
	{
		$num_rows = count($this->address);

		for ($i = 0; $i < $num_rows; $i++)
		{
			// dizinin tüm elemanlarını trim süzgecinden geçiriyoruz.
			$this->address[$i] = array_map('trim', $this->address[$i]);
			
			// e posta adresinin doğruluğunu teyid ediyoruz.
			$this->address[$i][4] = filter_var($this->address[$i][0], FILTER_VALIDATE_EMAIL) ? '0' : '2';
			
			$this->address[$i] = array_combine(array('address', 'firstname', 'lastname', 'gender', 'status'), $this->address[$i]);
		}
		
		return $this;
	}
	
	/**
	 * Dataları temp tabloya aktaralım
	 * 
	 */
	public function insert_to_temp()
	{
		$this->ci->db->insert_batch($this->tmp_table, $this->address);
		return $this;
	}
	
	/**
	 * Temp tabloda tutulan dataları filtreliyoruz.
	 * okey, blacklistte, zaten var gibi
	 */
	public function filter_on_db()
	{
		// remove distinct values;
		$this->ci->db->query("ALTER IGNORE TABLE _{$this->tmp_table} ADD UNIQUE INDEX(`address`)");
		
		// black listleri işaretle
		$this->ci->db->query("
			UPDATE _{$this->tmp_table} AS t1
			JOIN _subscriber AS t2
			ON t1.address = t2.address
			SET t1.status = '3'
			WHERE t1.status = '0' AND t2.user_id = {$this->user_id} AND t2.group_id = {$this->group_id} AND t2.status = '0'	 
		");
		
		// zaten olanları işaretleyelim
		$this->ci->db->query("
			UPDATE _{$this->tmp_table} AS t1
			JOIN _subscriber AS t2
			ON t1.address = t2.address
			SET t1.status = '4'
			WHERE t1.status = '0' AND t2.user_id = {$this->user_id} AND t2.group_id = {$this->group_id} AND t2.status = '1'				 
		");
		
		// geriye kalanlarda artık okeydir. Onlarıda okey olarak işaretleyelim
		$this->ci->db->update($this->tmp_table, array('status' => '1'), array('status' => '0'));
		
		return $this;		
	}
	
	/**
	 * Bu son adımdır. Sorunsuz dataları gerçek tabloya aktarır
	 */
	public function insert_db()
	{
		$q = $this->ci->db->get_where($this->tmp_table, array('status' => '1'));
		
		$data = array();
		if($q->num_rows())
		{
			$curdate = date("Y-m-d H:i:s");
			
			foreach($q->result() as $row)
			{
				$data[] = array(
					'group_id' => $this->group_id,
					'user_id' => $this->user_id,
					'address' => $row->address,
					'firstname' => $row->firstname,
					'lastname' => $row->lastname,
					'gender' => ($row->gender != 'm' AND $row->gender != 'f')? 'u' : $row->gender,
					'date_add' => $curdate
				);
			}
			
			$this->ci->db->insert_batch('subscriber', $data);
		}
		
		return $this;
	}
	
	/**
	 * Db de geçici bir tablo oluşturur.
	 */
	public function create_temp_table()
	{
		// create temp table
		$this->tmp_table = uniqid("_tmp");
		
		$sql = "CREATE TEMPORARY TABLE {$this->tmp_table} (";
		$sql .= "`address` varchar(255) NOT NULL";
		$sql .= ", `firstname` varchar(255) NOT NULL";
		$sql .= ", `lastname` varchar(255) NOT NULL";
		$sql .= ", `gender` varchar(1) NOT NULL";
		$sql .= ", `status` enum('0', '1', '2', '3', '4') NOT NULL";
		$sql .= ", KEY `status` (`status`)";
		$sql .= ") DEFAULT CHARACTER SET=utf8";
		
		$this->ci->db->query($sql);
		
		// return table name;
		return ltrim($this->tmp_table, '_');
	}

	/**
	 * İçeri aktarım işlemi hakkında rapor üretip bunu
	 * $this->session->set_flashdata() şeklinde sessiona yazdırır
	 *
	 * @return void
	 */
	public function create_report()
	{
		$num_success         = $this->ci->db->where('status', '1')->count_all_results($this->tmp_table);
		$num_invalid_address = $this->ci->db->where('status', '2')->count_all_results($this->tmp_table);
		$num_unsubscribe     = $this->ci->db->where('status', '3')->count_all_results($this->tmp_table);
		$num_already_exists  = $this->ci->db->where('status', '4')->count_all_results($this->tmp_table);
		
		$report = "<strong>İçeri Aktarım Raporu</strong><br />";
		$report .= "Toplam eklenen : {$num_success}";
		$report .= " | Geçersiz e posta : {$num_invalid_address}";
		$report .= " | Zaten gurupta var olan e posta : {$num_already_exists}";
		$report .= " | Blacklist : {$num_unsubscribe}<br />";
		$report .= "Ayrıntılı raporu bilgisayarınıza indirmek için <a href='" . site_url('backend/import/download_report') . "'>buraya</a> tıklayın.";

		$this->ci->session->set_flashdata('status', '<div class="notification success no_auto_close">' . $report . '</div>');

	}

	/**
	 * dosya uzantısını döndürür.
	 *
	 * @param string $file
	 * @return string
	 */
	private function _file_ext()
	{
		$file = $this->file_path;
		return substr($file, strrpos($file, '.') + 1);
	}

	/**
	 * eposta adresindeki kopyalama olaylarından falan kaynaklanan istenmeyen
	 * karekterleri yokeder.
	 *
	 * @param string email
	 * $return string
	 */
	private function _clean_email(&$email)
	{
		$email = preg_replace('/[^(\x20-\x7F)]*/', '', $email);
		$email = preg_replace('/\'|,/', '', $email);
		$email = strtolower(trim($email));
	}

}

/* End of file Import_lib.php */
